# 编译为目标文件
%.o : %.c
	gcc -c $< -o $@

# 编译cpp为目标文件
%.o : %.cpp
	g++ -c $< -o $@

# 使用静态链接生成可执行文件
hello.out : main.o  my_math.o
	g++ $^ -o $@

hello_static.out : main.o  my_math.o
# 一般情况下，程序都是动态链接的，因为默认用到了libc.so库
# 只有额外制定了 --static 才会是一个纯静态可执行文件
	g++ --static $^ -o $@	

# 编译为动态链接库
libmy_math.so : my_math.c
# 编译为目标文件
# -fPIC 选项生成位置无关代码（Position Independent Code），这是创建共享库所必需的。
# 要想多个进程共享so库中的代码指令，就必须使用PIC标志位
	gcc -g -O2 -fPIC -c $< -o my_math_pic.o  
# 创建共享库	
	gcc -shared my_math_pic.o -o $@
# 	注意：不能使用 gcc -shared -fPIC -c my_math.c -o libmy_math.so
#	这样生成的还是普通的静态链接库，根本不会被动态链接



# 链接主程序与动态链接库
dy_hello.out : main.o libmy_math.so
# 	-L. 告诉链接器在当前目录查找库
#	-lmy_math 指定要链接的库（去掉 'lib' 前缀和 '.so' 后缀）
	g++ -g -O2 $< -L. -lmy_math  -o $@


dy : dy_hello.out

clean:
	rm -rf *.so *.o *.out  